package com.hy.example.shared.distribute.map;

import com.hy.example.shared.distribute.lock.DistLock;
import com.hy.example.shared.distribute.lock.DistReadWriteLock;
import com.hy.example.shared.distribute.lock.DistLock;
import com.hy.example.shared.distribute.lock.DistReadWriteLock;
import com.hy.example.shared.distribute.lock.DistLock;
import com.hy.example.shared.distribute.lock.DistReadWriteLock;

import java.util.concurrent.ConcurrentMap;

/**
 * 分布式 Map 定义, 扩展 @see java.util.concurrent.ConcurrentMap 具有线程安全特性, 提供JDK Map 一致的使用体验
 *
 * @param <K> Map Key 类型
 * @param <V> Map Value 类型
 */
public interface DistMap<K, V> extends ConcurrentMap<K, V> {
    /**
     * 获取锁
     *
     * @param key 元素key
     * @return 可重入锁
     */
    DistLock getLock(K key);

    /**
     * 获取读写锁
     *
     * @param key 元素key
     * @return 读写锁
     */
    DistReadWriteLock getReadWriteLock(K key);
    
    /**
     * 快速插入数据，只返回是否成功
     *
     * @param key   key 值
     * @param value value 值
     * @return 是否成功
     */
    default boolean fastPut(K key, V value) {
        return put(key, value) == null;
    }

    /**
     * 如果不存在快速插入数据，只返回是否成功
     *
     * @param key   key 值
     * @param value value 值
     * @return 是否成功
     */
    default boolean fastPutIfAbsent(K key, V value) {
        if (containsKey(key)) {
            return false;
        }
        fastPut(key, value);
        return true;
    }

    /**
     * 快速删除值，只返回是否成功
     *
     * @param key key 值
     */
    default void fastRemove(K key) {
        remove(key);
    }
}
